<?php
namespace Monkey\Database\SqlHelper;

use Monkey\Database\QueryHelper as QueryHelper;
/**
 * 删除操作助手\Monkey\Database\SqlHelper\Delete
 * @package    Monkey\Database\SqlHelper
 * @author     HuangYi
 * @copyright  Copyright (c) 2011-07-01——2013-03-30
 * @license    New BSD License
 * @version    $Id: \Monkey\Database\SqlHelper\Delete.php 版本号 2013-03-30 $
 */
class Delete
{
    /**
     * @var \Monkey\Database\QueryHelper\_Interface
     */
    private $_queryHelper;
    private $_options;
    public function __construct(){}
    /**
     * @param \Monkey\Database\QueryHelper\_Interface &$queryHelper
     * @return \Monkey\Database\SqlHelper\Delete
     */
    public function _reset( QueryHelper\_Interface &$queryHelper){
        $this->_queryHelper=$queryHelper;
        $this->_options=array();
        return $this;
    }
    /**
     * 设置要删除数据的表名
     * @param string $table 表名。不能带前缀，程序自动加入前缀；也不支持别名。
     * @return \Monkey\Database\SqlHelper\Delete
     */
    public function table($table){
        $this->_options['table']=trim($table);
        return $this;
    }
    /**
     * 添加where语段
     * @param string $conditions 查询条件。当条件中含有可能注入的内容，将这个内容复制到第二个数组参数中，并用“<对应的键名>”形式，替换原条件中的内容
     * @param null|string|array $params 查询条件中可能注入的内容的替换列表，为字符串时表示所有内容都替换成这个。替换前，程序会自动过滤危险字符。
     * @return \Monkey\Database\SqlHelper\Delete
     */
    public function where($conditions,$params=null){
        if(!is_string($conditions))return $this;
        if(!is_null($params))$conditions=$this->parseConditions($conditions,$params);
        $this->_options['where'][]=$conditions;
        return $this;
    }
    /**
     * 添加 orderby 语段
     * @param string $field 字段名
     * @param bool $isASC 是否为升序
     * @return \Monkey\Database\SqlHelper\Delete
     */
    public function orderby($field, $isASC=TRUE){
        $isASC=$isASC?'ASC':'DESC';
        $this->_options['orderby'][$isASC][]='[:'.$field.':]';
        return $this;
    }
    /**
     * 设置 Limit 语段
     * @param integer $length 选择记录条数
     * @param integer $start 起始位置，默认为0（从第一条数据开始选择）
     * @return \Monkey\Database\SqlHelper\Delete
     */
    public function limit($length,$start=null){
        $this->_options['limit']=array('start'=>intval($start),'length'=>intval($length));
        return $this;
    }
    /**
     * 生成sql语句
     * @return string
     */
    public function getSql(){
        return $this->_queryHelper->buildDelete($this->_options);
    }
    /**
     * 执行生成的sql语句。
     * @return \Monkey\Database\Driver\_Interface
     */
    public function exec(){
        $options=$this->_options;
        $this->_options=array();
        return $this->_queryHelper->delete($options);
    }
    /**
     * 解析条件中的参数
     * @param string $conditions 条件
     * @param null|string|array $params 要植入到条件中的参数
     * @return string
     */
    private function parseConditions($conditions,$params=null){
        if(is_null($params))return $conditions;
        $params=$this->_queryHelper->escape($params);
        if(is_array($params)){
            $_params_key=array();
            foreach($params as $key=>$val){
                $_params_key[$key]='<'.$key.'>';
            }
            return str_replace($_params_key, $params, $conditions);
        }else{
            return preg_replace('/<(\S+)>/i', $params, $conditions);
        }
    }
}